#ifndef UNION_FIND_H
#define UNION_FIND_H

#include "arista.h"
#include "bool.h"

typedef int tufalpha;
typedef int tufset;
typedef struct sunionfind * union_find;

/* Constructor del TAD */
union_find uf_create(const size_t max);

/* Agregar un elemento al Conjunto */
void uf_add_singulete(union_find uf, const tufalpha el); 

/* Determina la componenete conexa a la que pertenece el elemento en cuestión */
tufset uf_find(union_find uf, const tufalpha el);

/* Une los los conjuntos representados por s1 y s2 */
void uf_union(union_find uf, const tufset s1, const tufset s2);

/* Determina si existe exactamente un conjunto de nodos */
Bool uf_oneset(const union_find uf);

/* Retorna el número de componentes conexas */
int uf_cantset(union_find uf);

/* Destructor del TAD */
union_find uf_destroy(union_find uf);

/* Determina si el elemento j es representante de su clase */
Bool is_rep(union_find uf, tufalpha j);

#endif /* UNION_FIND_H */
